<?php

namespace App\Controllers;

use Framework\Database;

use Framework\Validation;
use Framework\Session;
use Framework\Middleware\Authorise;
use Framework\Authorisation;
class ListingController
{
    protected $db;

    public function __construct()
    {
        $config = require basePath('config/db.php');
        $this->db =new Database($config);

    }

    public function index()
    {
        $listings = $this->db->query('SELECT * FROM listing ORDER BY created_at DESC')->fetchAll();

        loadView('listings/index',[
            'listings' => $listings
        ]);
    }

    public function create()
    {
        loadView('listings/create');
    }
    
    public function show($params){
        $id = $params['id'] ?? '';

        $params = [
            'id' => $id
        ];

        $listing = $this->db->query('SELECT * FROM listing WHERE id = :id',$params)->fetch();

        if(!$listing){
            ErrorController::notFound('该岗位不存在！');
            return;
        }
        loadView('listings/show',[
            'listing' =>$listing
        ]);
    }

    public function store(){
        $allowedFields = ['title','description','salary','tags','company','address','city','province','phone','email','requirements','benefits'];

        $newListingData = array_intersect_key($_POST,array_flip($allowedFields));

        $newListingData['user_id'] = Session::get('user')['id'];

        $newListingData = array_map('sanitize',$newListingData);
        
        $requiredFields = ['title','description','email','city','province'];

        $errors = [];
        foreach($requiredFields as $field){
            if(empty($newListingData[$field]) || !Validation::string($newListingData[$field])){
                $errors[$field] = ucfirst($field). ' 为必须项';
            }
        }

        if(!empty($errors)){
            loadView('listings/create',[
                'errors'=> $errors,
                'listing' => $newListingData
            ]);
        }else{
            $fields = [];
            foreach ($newListingData as $field => $value) {
                $fields[] = $field;
            } 
            $fields=implode(', ',$fields);
            $values = [];
            foreach($newListingData as $field => $value){if ($value === '') {
                $newListingData[$field] = null;
            }
            $values[]=':' . $field;
            }
            $values = implode(', ', $values);

            $query = "INSERT INTO listing ({$fields}) VALUES ({$values})";

            $this->db->query($query,$newListingData);

            Session::setFlashMessage('success_message','成功创造职业！');

            redirect('/listings');
        }
    }


    public function destroy($params){

        $id = $params['id'];

        $params = [
            'id' =>$id
        ];

        $listing = $this->db->query('SELECT * FROM listing WHERE id = :id',$params)->fetch();

        if(!$listing){
            ErrorController::notFound('职位不存在！');
            return;
        }

        if (!Authorisation::isOwner($listing->user_id)) {
            inspect($_SESSION);
            Session::setFlashMessage('error_message','你没有权限删除这个职位！');
            return redirect('/listings/'.$listing->id);
        }

        $this->db->query('DELETE FROM listing WHERE id = :id',$params);
        
        Session::setFlashMessage('error_message','删除职位成功！');

        redirect('/listings');
    }

    public function edit($params){
        $id = $params['id'];

        $params = [
            'id' =>$id
        ];
        $listing = $this->db->query('SELECT * FROM listing WHERE id = :id',$params)->fetch();

        if(!$listing){
            ErrorController::notFound('职位不存在！');
            return;
        }

        if (!Authorisation::isOwner($listing->user_id)) {
            Session::setFlashMessage('error_message','你没有权限修改职位');
            return redirect('/listings/' . $listing -> id);
        }

        loadView('listings/edit',[
            'listing' =>$listing
        ]);
    }

    public function update($params){
        $id = $params['id'] ?? '';

        $params = [
            'id' => $id
        ];
        $listing = $this->db->query('SELECT * FROM listing WHERE id = :id',$params)->fetch();

        if(!$listing){
            ErrorController::notFound('职位不存在！');
            return;
        }

        
        if (!Authorisation::isOwner($listing->user_id)) {
            Session::setFlashMessage('error_message','你没有权限修改职位');
            return redirect('/listings/' . $listing -> id);
        }

        $allowedFields = ['title','description','salary','tags','company','address','city','province','phone','email','requirements','benefits'];

        $updateValues = array_intersect_key($_POST,array_flip($allowedFields));

        $updateValues = array_map('sanitize',$updateValues);

        $requiredFields = ['title','description','salary','email','city','province'];

        $errors = [];

        foreach($requiredFields as $field){
            if (empty($updateValues[$field]) || !Validation::string($updateValues[$field])) {
                $errors[$field] = ucfirst($field) . ' 为必须项！';
            }
        }
        if(!empty($errors)){
            loadView('listings/edit',[
                'listing' => $listing,
                'errors' =>$errors

            ]);
            exit;
        }else{
            $updateFields = [];
            foreach(array_keys($updateValues) as $field){
                $updateFields[] = "{$field} = :{$field}";
            }
            $updateFields = implode(', ', $updateFields);
            // 更新语句
            $updateQuery = "UPDATE listing SET $updateFields WHERE id = :id";

            $updateValues['id'] = $id;

            $this->db->query($updateQuery,$updateValues);

            Session::setFlashMessage('success_message','职位信息已更新');
            
            redirect('/listings/' . $id);


        }
    }

    public function search(){
        $keywords = isset($_GET['keywords']) ? trim($_GET['keywords']) : '';
        $location = isset($_GET['location']) ? trim($_GET['location']) : '';

        $query = "SELECT * FROM listing WHERE 
                    (title like :keywords or description like :keywords or tags like :keywords 
                    or company like :keywords) and 
                    (city like :location or province like :location)";
        $params = [
            'keywords' => "%{$keywords}%",
            'location' => "%{$location}%"
        ];

        $listings = $this->db->query($query,$params)->fetchAll();

        loadView('/listings/index',[
            'listings' => $listings ,
            'keywords' => $keywords ,
            'location' => $location 
        ]);
    }
}